/*
 * Criado em Apr 20, 2005
 *
 *
 */
package gminet.infra.toolkit;

/**
 * @author Gabriel Flores Mendes
 * 
 * 
 */
public final class ValidatorToolkit {

    /**
     * 
     */
    private ValidatorToolkit() {
        super();
    }

    public static boolean validateEmail(String email) {

        boolean valid = true;
        if (email == null || email.equals("")) {
            valid = false;
        }
        if (email.indexOf(" ") > -1) {
            valid = false;
        } else if (email.indexOf("@") <= 0) {
            valid = false;
        } else if (email.indexOf(".", email.indexOf("@") + 1) <= 0) {
            valid = false;
        }
        return valid;
    }

    public static boolean validateCPF(String cpf) {

        boolean valid = true;
        if (cpf == null || cpf.length() != 11) {
            valid = false;
        }
        try {
            String numero = cpf.substring(0, 9);
            String dv = calculaDVCPF(numero);
            valid = cpf.substring(9, 11).equals(dv);
        } catch (NumberFormatException nfe) {
            valid = false;
        }
        return valid;
    }

    private static String calculaDVCPF(String numero) throws NumberFormatException {

        // calculo do primeiro digito verificador
        int verificador1 = 0;
        for (int i = 0; i < 9; i++) {
            verificador1 = verificador1 + Integer.parseInt(numero.substring(i, i + 1)) * (10 - i);
        }
        verificador1 = verificador1 % 11;
        if (verificador1 <= 1) {
            verificador1 = 0;
        } else {
            verificador1 = 11 - verificador1;
        }

        // calculo do segundo digito verificador
        int verificador2 = 0;
        for (int i = 0; i < 9; i++) {
            verificador2 = verificador2 + Integer.parseInt(numero.substring(i, i + 1)) * (11 - i);
        }
        verificador2 = verificador2 + verificador1 * 2;
        verificador2 = verificador2 % 11;
        if (verificador2 <= 1) {
            verificador2 = 0;
        } else {
            verificador2 = 11 - verificador2;
        }
        return (Integer.toString(verificador1) + Integer.toString(verificador2));
    }

    public static boolean validateCNPJ(String cnpj) {

        int soma = 0, dig;
        String calc = cnpj.substring(0, 12);
        if (cnpj.length() != 14) {
            return false;
        }
        char[] chrCnpj = cnpj.toCharArray();
        for (int i = 0; i < 4; i++) {
            if (chrCnpj[i] - 48 >= 0 && chrCnpj[i] - 48 <= 9) {
                soma += (chrCnpj[i] - 48) * (6 - (i + 1));
            }
        }
        for (int i = 0; i < 8; i++) {
            if (chrCnpj[i + 4] - 48 >= 0 && chrCnpj[i + 4] - 48 <= 9) {
                soma += (chrCnpj[i + 4] - 48) * (10 - (i + 1));
            }
        }
        dig = 11 - (soma % 11);
        calc += (dig == 10 || dig == 11) ? "0" : Integer.toString(dig);
        soma = 0;
        for (int i = 0; i < 5; i++) {
            if (chrCnpj[i] - 48 >= 0 && chrCnpj[i] - 48 <= 9) {
                soma += (chrCnpj[i] - 48) * (7 - (i + 1));
            }
        }
        for (int i = 0; i < 8; i++) {
            if (chrCnpj[i + 5] - 48 >= 0 && chrCnpj[i + 5] - 48 <= 9) {
                soma += (chrCnpj[i + 5] - 48) * (10 - (i + 1));
            }
        }
        dig = 11 - (soma % 11);
        calc += (dig == 10 || dig == 11) ? "0" : Integer.toString(dig);
        return chrCnpj.equals(calc);
    }

}
